﻿using Newtonsoft.Json.Linq;
using System.Text;

namespace S.BreedingHistory.Read.Api.Extensions.Middlerware
{
    public class DateFormatMiddleware : IMiddleware
    {
        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
        {
            // 在此处进行处理
            if (context.Request.Path.StartsWithSegments("/api"))
            {

                // 检查请求的内容类型
                string contentType = context.Request.ContentType;

                // 如果是JSON请求
                if (!string.IsNullOrEmpty(contentType) && contentType.Contains("application/json"))
                {
                    // 获取原始请求体
                    var originalBodyStream = context.Request.Body;

                    try
                    {
                        // 读取请求体，进行修改
                        using (var memoryStream = new MemoryStream())
                        {
                            await originalBodyStream.CopyToAsync(memoryStream);
                            memoryStream.Seek(0, SeekOrigin.Begin);

                            // 读取修改后的请求体字符串
                            string requestBody = await new StreamReader(memoryStream).ReadToEndAsync();

                            // 将时间格式统一为标准格式，例如："yyyy-MM-dd HH:mm:ss"
                            string modifiedRequestBody = ModifyRequestJson(requestBody);

                            // 将修改后的请求体字符串转换为字节数组
                            byte[] requestBodyBytes = Encoding.UTF8.GetBytes(modifiedRequestBody);

                            // 使用修改后的请求体字节数组创建新的内存流
                            var modifiedBodyStream = new MemoryStream(requestBodyBytes);

                            // 使用新的内存流作为请求体
                            context.Request.Body = modifiedBodyStream;

                            // 继续处理请求
                            await next(context);
                        }
                    }
                    finally
                    {
                        // 恢复原始请求体
                        context.Request.Body = originalBodyStream;
                    }
                }
                else
                {
                    // 如果不是JSON请求，继续处理请求
                    await next(context);
                }
            }
            else
            {
                // 如果不是API请求，继续处理请求
                await next(context);
            }
        }

        private string ModifyRequestJson(string requestBody)
        {
            // 根据您的需求，进行时间格式的转换
            // 例如，将所有时间格式转换为"yyyy-MM-dd HH:mm:ss"
            // 这里使用了Newtonsoft.Json库来处理JSON
            JObject jsonObject = JObject.Parse(requestBody);

            // 遍历JSON对象的所有属性
            foreach (var property in jsonObject.DescendantsAndSelf().OfType<JProperty>())
            {
                // 检查属性值是否为DateTime类型
                if (property.Value is JValue jValue && jValue.Value is DateTime dateTime)
                {
                    // 将时间格式转换为标准格式
                    property.Value = dateTime.ToString("yyyy-MM-dd HH:mm:ss");
                }
            }

            return jsonObject.ToString();
        }
    }
}
